package cc.bookcloud.tool.ocr.common.parsetext.feature;

import com.alibaba.fastjson.JSONArray;
import lombok.Data;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Desc: 票据特征抽象
 * @Version: 2.0
 * @Author: John Goo
 * @Date: 2024/11/29 11:36
 **/
@Data
public abstract class InvoiceFeatureTemplateAbstract {


    // 基础行数
    protected Integer baseLineCnt = 0;

    // 累积总分数
    protected Integer totalScore = 0;

    private List<String> attrList = null;

    // 长宽比例 w/h = 1.5
    protected Double rate = 1.5;

    // 长度
    protected int width = 0;
    // 宽度
    protected int height = 0;

    // 坐标值
    protected JSONArray coordinate = new JSONArray();

    // 基准行数
   // public abstract void baseLineCnt();

    // 发票类型（公共）
    protected String type ;
    // 发票类型描述（公共）
    protected String typeDesc="未知";

    public InvoiceFeatureTemplateAbstract(String type, String typeDesc){
        this.type = type;
        this.typeDesc = typeDesc;
    }

    public InvoiceFeatureTemplateAbstract(){

    }

    public void score(int pos, String text, JSONArray array) {
        // 初始化字段
        Class<?> objClass = this.getClass();
        if(attrList == null) {
            attrList = new ArrayList<>();
            //把当前对象的数据状态转换成json数组形式
            Field[] fields = objClass.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true); // 使私有属性可访问
                // Object value = field.get(this);
                String key = field.getName();
                attrList.add(key);
            }
        }
        // 匹配度分数计算函数
        for (int j = 0; j < attrList.size(); j++) {
            String attrName = attrList.get(j);
            // 动态执行对象属性方法

            try {
                Method method = objClass.getMethod(attrName,Integer.class,String.class,JSONArray.class);
                // 是否命中:true-命中；false-未命中
                 method.invoke(this, pos,text,array);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

        }

    }

    public int height(Integer w){
        return (int) (w/1.5);
    }

    // 坐标起始点 (x,y)
    public void coordinate(int x,int y){
        coordinate.add(x);
        coordinate.add(y);
    }




    public static List fixedPointSort(int x,int y,List subList){
        // 根据x排序 ,@todo 需要深度复制操作

        List newList = new ArrayList();

        newList.addAll(subList);

        newList.sort(
                (p1,p2)->Integer.compare(((JSONArray)p1).getJSONArray(0).getJSONArray(0).getInteger(0),
                        ((JSONArray)p2).getJSONArray(0).getJSONArray(0).getInteger(0))
        );
//        JSONArray subArray = new JSONArray();
//        //System.out.println("=====（1）======= "+newList);
//        for(Object item :newList){
//            JSONArray point1 = ((JSONArray)item).getJSONArray(0).getJSONArray(0);
//            int y1 = point1.getInteger(1);
//            // @todo 根据分辨率自适应调整 10
//            int d = y1 - y;
//          //s  System.out.println("===（2）=d:"+d);
//           // if( d<=20 ){
//                subArray.add((JSONArray) item);
//           // }
//        }

        return newList;
    }



}
